package programs;

/**
 * 单例模式 --- 懒汉式
 */
public class Singleton2_2 {

    public static void main(String[] args) {

        Thread t1 = new Thread(() -> {
            Singleton s1 = Singleton.getInstance();
        });
        Thread t2 = new Thread(() -> {
            Singleton s2 = Singleton.getInstance();
        });
        Thread t3 = new Thread(() -> {
            Singleton s3 = Singleton.getInstance();
        });
        t1.start();
        t2.start();
        t3.start();
    }
}

// 通过 Singleton 这个类来实现
class Singleton{
    private String name;
    private int age;
    // 这个 instance 就是该类的唯一实例
    private static volatile Singleton instance = null;// 类成员
    // 为了防止再获得他的对象,将构造方法私有化
    private Singleton() {}

    // 提供方法让外界拿到 instance 对象
    // 只有当真正要用到实例时,才会创建实例
    public static Singleton getInstance(){
        // 看要不要加锁
        if (instance == null) {
            synchronized (Singleton.class){
                // 看是否要创建实例
                if (instance == null) {
                    // 初始化之后,就不会再进行修改,线程安全
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
